package condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.LoginExcepcion;
import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Persona;
import condominio.util.ConexionBD;

public class PersonaDAO extends BaseDAO{
	
	public Persona login(String dni, String contrasena) throws DAOExcepcion ,
	LoginExcepcion  {
		String query = "select pers_id,pers_dni,pers_contrasena,pers_nombres,pers_apellidos,pers_tipo from Persona where pers_dni = ? and pers_contrasena = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Persona pe = new Persona();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, dni);
			stmt.setString(2, contrasena);
			rs = stmt.executeQuery();

			if (rs.next()) {
				pe.setIdpersona(rs.getString("pers_id"));
				pe.setDni(rs.getString("pers_dni"));
				pe.setContrasena(rs.getString("pers_contrasena"));
				pe.setNombres(rs.getString("pers_nombres"));
				pe.setApellidos(rs.getString("pers_apellidos"));
				pe.setTipo(rs.getString("pers_tipo"));
			} else {
				throw new LoginExcepcion("No existe");
			}
		} catch (LoginExcepcion e) {
			System.err.println(e.getMessage());
			throw new LoginExcepcion(e.getMessage());
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return pe;
		
	}
	
	public void insertar(Persona pe) throws DAOExcepcion {
		System.out.println("PersonaDAO: insertar(Persona pe)");
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			
			String query = "INSERT INTO Persona(pers_tipo,pers_nombres,pers_apellidos,pers_dni,pers_fch_nac,pers_email,pers_contrasena,pers_estado) VALUES (?,?,?,?,?,?,?,?)";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, pe.getTipo());
			stmt.setString(2, pe.getNombres());
			stmt.setString(3, pe.getApellidos());
			stmt.setString(4, pe.getDni());
			stmt.setString(5, pe.getFechaNacimiento());
			stmt.setString(6, pe.getMail());
			stmt.setString(7, pe.getContrasena());
			stmt.setString(8, pe.getEstado());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void ActualizaEstado(String Idpersona) throws DAOExcepcion {
		System.out.println("PersonaDAO: ActualizaEstado(String idPersona)");
		String query = "UPDATE Persona set pers_estado='0' WHERE pers_id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, Idpersona);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo dar de Baja");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Persona ObtenerPersona(int id) throws DAOExcepcion {
		System.out.println("PersonaDAO: ObtenerPersona(int id)");
		Persona persona = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT pers_nombres,pers_apellidos from Persona where pers_id=?";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona pe = new Persona();
				pe.setNombres(rs.getString("pers_nombres"));
				pe.setApellidos(rs.getString("pers_apellidos"));
				persona=pe;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return persona;
	}
	
	public Persona dniPersona(String dni) throws DAOExcepcion {
		System.out.println("PersonaDAO: dniPersona(String dni)");
		Persona persona = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT pers_nombres,pers_apellidos,pers_dni from Persona where pers_dni=?";
			stmt = con.prepareStatement(query);
			stmt.setString(1,dni);
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona pe = new Persona();
				pe.setNombres(rs.getString("pers_nombres"));
				pe.setApellidos(rs.getString("pers_apellidos"));
				pe.setDni(rs.getString("pers_dni"));
				persona=pe;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return persona;
	}
	
	public Collection<Persona> listarUsuario() throws DAOExcepcion {
		
		System.out.println("listarUsuario()");
		Collection<Persona> c = new ArrayList<Persona>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT pers_id,pers_nombres, pers_apellidos,pers_dni, CASE pers_tipo WHEN 'A' THEN 'Administrador' WHEN 'R' THEN 'Residente' ELSE 'Propietario' END AS pers_tipo  FROM PERSONA  where pers_estado='A'";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona objPersona = new Persona();
				objPersona.setIdpersona(rs.getString("pers_id"));
				objPersona.setNombres(rs.getString("pers_nombres"));
				objPersona.setApellidos(rs.getString("pers_apellidos")); 
				objPersona.setDni(rs.getString("pers_dni"));
				objPersona.setTipo(rs.getString("pers_tipo"));
				c.add(objPersona);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}
